package com.example.apidocserver.interfaces.assembler;

import com.alibaba.druid.util.StringUtils;
import com.example.apidocserver.domain.document.entity.ApiInfo;
import com.example.apidocserver.domain.document.entity.ApiParam;
import com.example.apidocserver.domain.document.entity.ApiParamField;
import com.example.apidocserver.infrastructure.util.result.ParamException;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import static com.example.apidocserver.infrastructure.constants.SystemConstants.STR_NO;
import static com.example.apidocserver.infrastructure.constants.SystemConstants.YES;

/**
 * 接口数据检测
 *
 * @author xyqlg
 */
public class ApiAssembler {
    /**
     * 参数说明校验
     *
     * @param paramDescVo 参数说明
     */
    public static void checkParamDesc(ApiParam paramDescVo) {
        checkParam(paramDescVo);
        checkFields(paramDescVo.getFields(), paramDescVo.getApiId());
    }

    /**
     * 校验参数说明
     *
     * @param paramDescVo 参数说明对象
     */
    private static void checkParam(ApiParam paramDescVo) {
        if (Objects.isNull(paramDescVo.getApiId()) || Objects.isNull(paramDescVo.getParamType())
                || Objects.isNull(paramDescVo.getDataType())) {
            throw new ParamException("接口id、参数类型、参数出入参类型不能为空。");
        }
    }

    /**
     * 校验字段数据
     *
     * @param fields 字段说明数据
     * @param apiId  接口id
     */
    private static void checkFields(List<ApiParamField> fields, Integer apiId) {
        Set<String> nameSet = new HashSet<>(fields.size());
        for (ApiParamField field : fields) {
            if (StringUtils.isEmpty(field.getFieldName()) || Objects.isNull(field.getFieldTypeId())
                    || Objects.isNull(field.getDescMode()) || Objects.isNull(field.getSpaceId())) {
                throw new ParamException("字段名称、值类型、工作空间id、值说明模式不能为空。");
            }
            field.setFieldName(field.getFieldName().trim());
            if (Objects.isNull(field.getApiId())) {
                field.setApiId(apiId);
            }
            if (StringUtils.isEmpty(field.getFieldMust())) {
                field.setFieldMust(STR_NO);
            }
            if (Objects.isNull(field.getEnableFlag())) {
                field.setEnableFlag(YES);
            }
            if (Objects.isNull(field.getUsePriority())) {
                field.setUsePriority(YES);
            }

            if (nameSet.contains(field.getFieldName())) {
                throw new ParamException("字段名称重复。");
            } else {
                nameSet.add(field.getFieldName());
            }
        }
    }

    /**
     * 接口数据校验
     *
     * @param apiInfo 接口数据
     */
    public static void checkApiInfo(ApiInfo apiInfo) {
        if (StringUtils.isEmpty(apiInfo.getApiName()) || StringUtils.isEmpty(apiInfo.getApiType())
                || StringUtils.isEmpty(apiInfo.getApiUri())) {
            throw new ParamException("接口名称、请求类型、uri不能为空。");
        }
        if (Objects.isNull(apiInfo.getSpaceId())) {
            throw new ParamException("工作框架id不能为空。");
        }
        apiInfo.setApiName(apiInfo.getApiName().trim());
        if (Objects.isNull(apiInfo.getEnableFlag())) {
            apiInfo.setEnableFlag(YES);
        }
    }

    /**
     * 模糊查询接口数据校验
     *
     * @param apiInfo 接口数据
     * @param docId   文档id
     */
    public static void checkApiInfoLike(ApiInfo apiInfo, Integer docId) {
        if (StringUtils.isEmpty(apiInfo.getApiName()) || StringUtils.isEmpty(apiInfo.getApiUri())) {
            throw new ParamException("接口名称、请求类型、uri不能为空。");
        }
        if (Objects.isNull(apiInfo.getSpaceId()) || Objects.isNull(docId)) {
            throw new ParamException("工作空间或文档id不能为空。");
        }
        apiInfo.setApiName(apiInfo.getApiName().trim());
        if (YES.equals(apiInfo.getEnableFlag())) {
            apiInfo.setEnableFlag(null);
        }
    }
}
